package com.xuexiang.xuidemo.page.base;

import ohos.agp.components.Component;
import ohos.agp.components.ComponentParent;
import ohos.agp.components.LayoutScatter;
import ohos.app.Context;

/**
 * BaseProvider.BaseHolder
 *
 * @param <E> Holder数据类型
 * @since 2021-03-25
 */
public abstract class BaseHolder<E> {
    private static final int NO_POSITION = -1;

    /**
     * ViewHolder的根布局
     */
    Component itemComponent;

    /**
     * 构造
     *
     * @param component 根布局
     */
    public BaseHolder(Component component) {
        this.itemComponent = component;
    }

    /**
     * 根据布局id构造Holder
     *
     * @param context 上下文
     * @param layoutId 布局id
     */
    public BaseHolder(Context context, int layoutId) {
        this(LayoutScatter.getInstance(context).parse(layoutId, null, false));
    }

    /**
     * 在跟布局节点以及子节点寻找符合id的组件
     *
     * @param resId 目标id
     * @param <T> 目标泛型
     * @return 目标
     */
    protected <T extends Component> T findCastComponentById(int resId) {
        // noinspection unchecked
        return (T) itemComponent.findComponentById(resId);
    }

    /**
     * 绑定Holder方法回调, 子类必须复写
     *
     * @param position 元素在数据列表的位置
     * @param data 数据
     */
    public abstract void onBindComponent(int position, E data);

    /**
     * 返回Holder在ListContainer的位置
     *
     * @return 在父容器的位置
     */
    public int getPosition() {
        ComponentParent componentParent = itemComponent.getComponentParent();
        if (componentParent == null) {
            return NO_POSITION;
        }
        return componentParent.getChildIndex(itemComponent);
    }

    /**
     * 返回Holder的根布局
     *
     * @return 根布局
     */
    public Component getItemComponent() {
        return itemComponent;
    }
}
